// app.js
const express = require('express');
const { expressjwt } = require('express-jwt');
const cors = require('cors');
const bodyParser = require('body-parser');
const config = require('./config'); // 引入配置文件


const app = express();
const port = config.server.port || 3000;

//配置解析表单数据中间件
app.use(express.urlencoded({extended: false}))

const loginRouter = require('./router/login'); // 引入登陆路由
const userRouter = require('./router/user');
const deviceRouter = require('./router/device');



app.use(bodyParser.json());
app.use(cors());// 允许跨域
app.use(expressjwt({ secret: config.jwtSecretKey, algorithms: ['HS256'] }).unless({
    path: ['/login'], //指定路径不经过鉴权
}))

// 响应数据的中间件,绑定到全局res上
app.use(function (req, res, next) {
    // status = true 为成功； status = false 为失败； 默认将 status 的值设置为 false，方便处理失败的情况
    res.cc = function (err, status = false) {
        res.send({
            // 状态
            status,
            // 状态描述，判断 err 是 错误对象 还是 字符串
            message: err instanceof Error ? err.message : err,
        });
    };
    next();
});


//路由
app.use('/', loginRouter);
app.use('/admin', userRouter);
app.use('/device', deviceRouter);


//错误级别的中间件
app.use((err, req, res, next) => {
    // console.log(err);
    if (err.name === 'UnauthorizedError') {
        res.status(401).cc('无效的token')
    } else {
        res.status(500).cc('未知错误:' + err)
    }
})

app.listen(port, () => {
    console.log(`服务器正在运行 http://${config.server.host}:${port}`);
});
